package utils

import (
	"chatroom/common/message"
	"encoding/binary"
	"encoding/json"
	"fmt"
	"net"
)

type Transfer struct {
	Conn net.Conn
	Buf  [809]byte // 这是传输时，使用缓冲
}

func (this *Transfer) ReadPkg() (mes message.Message, err error) {
	buf := make([]byte, 8096)
	_, err = this.Conn.Read(buf[:4])
	if err != nil {
		return
	}

	// 根据buf[:4] 转成一个 uint32类型
	var pkgLen uint32
	pkgLen = binary.BigEndian.Uint32(buf[:4])
	// fmt.Printf("服务端接收到数据的长度=%d\n", pkgLen)
	// 根据 pkgLen 读取消息内容
	n, err := this.Conn.Read(buf[:pkgLen])
	if n != int(pkgLen) || err != nil {
		return
	}

	// 反序列化
	// 把 pkgLen 反序列化成 -> message.Message
	err = json.Unmarshal(buf[:pkgLen], &mes)
	if err != nil {
		fmt.Println("json.Unmarshal err=", err)
		return
	}

	return
}

func (this *Transfer) WritePkg(data []byte) (err error) {
	// 先发送data的长度给客户端
	var pkgLen uint32
	pkgLen = uint32(len(data))
	var buf [4]byte
	binary.BigEndian.PutUint32(buf[:4], pkgLen)

	// 发送长度
	n, err := this.Conn.Write(buf[:4])
	if n != 4 || err != nil {
		fmt.Println("conn.Write(bytes) fail", err)
	}

	// 发送消息本身
	_, err = this.Conn.Write(data)
	if err != nil {
		fmt.Println("conn write(bytes) err=", err)
		return
	}

	return
}
